	\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
%\usepackage[font=scriptsize,labelfont=bf]{caption}
%\usepackage{multimedia}
\usepackage{fancyhdr}
\pagestyle{fancy}
\usepackage[german]{babel}
\usepackage{hyperref}
\usepackage{dirtree}
\usepackage{color}
\usepackage{graphicx}
\definecolor{deepblue}{rgb}{0,0,0.5}
\definecolor{deepred}{rgb}{0.6,0,0}
\definecolor{deepgreen}{rgb}{0,0.5,0}

\usepackage{listings}


\title{Musikstreamingserver Zeya}

\author{Timotheus Bachinger}


 
\begin{document}
	
\begin{titlepage}
\thispagestyle{empty}
\maketitle
\begin{center}

Bericht Projektpraktikum\\
\vspace{1cm}
-\\
\vspace{1cm}
Betreuer:\\
\textbf{Dipl.-Ing. Thomas Spittler}\\
\vspace{1cm}
-\\
\vspace{1cm}
Lehrstuhl für medizinische Elektronik\\
Technische Universität München
\vspace{1cm}

\includegraphics[scale=0.3]{pics/LME_Logo.png}






\end{center}
\end{titlepage}


\thispagestyle{empty}
\clearpage

\tableofcontents
\clearpage
 
\part{Einleitung}

Zur Erforschung der therapeutischen Wirkung von Musik, wird in dieser Arbeit ein Streamingserver beschrieben, welcher Musik auf verschiedene Endgeräte überträgt. Hauptmerkmal soll dabei das Streamen auf Smartphones sein. Zugriffe auf Musikstücke sollen nach Urzeit, Patienten ID, IP Adresse, Titel und vollständiger Übertragung in eine Datenbank geloggt werden.\\ 
Diese Arbeit beschreibt die Installation, Funktionalität, Anwendung und Problemlösung des Servers. Bei dem verwendeten Server handelt es sich um den in Python geschriebenen und frei verfügbaren Streamingserver "'Zeya"' (\url{http://web.psung.name/zeya/}) welcher unter der GNU Affero GPL, v.3 - Lizenz (\url{http://www.gnu.org/licenses/agpl-3.0.html}) frei bearbeitet werden darf. "'Zeya"' verwendet dabei den HTML5 Audiotag, welcher von gängigen Browser mittlerweile standardmäßig unterstützt wird. Dadurch wird vermieden, dass spezielle Software oder Plugins für Webbrowser am Endgeräte zusätzlich vorhanden sein müssen. "'Zeya"' ist des weiteren in Python programmiert. 

%\clearpage
\part{Installation}

Abbildung \ref{Ordnerstruk} zeigt die Orderstruktur der Serverdateien. Zur Installation unter einem Linuxsystem wird dieser Ordner in \textit{var/www/} abgelegt. Das Frontend ist dann unter \textbf{ http://host:8080} bzw. \textbf{ http://localhost:8080} erreichbar. Sollte der vorkonfigurierte Port 8080 belegt sein, so lässt sich dies im Terminal mittels folgendem Befehl auf z.B. Port 3000 ändern.
\begin{center}
\textbf{zeya --port=3000}
\end{center} 
Um den Befehl eingeben zu können, muss man sich im selben Ordner wie das Skript \textit{zeya.py} befinden. Der Port kann auch in dieser Datei manuell umgeschrieben werden. Die Verwendung von Port 80 (HTP Port) sollte vermieden werden.\\
Die Streamrate ist standard mäßig auf 64kbps eingstellt und kann mittels folgendem Befehl auf z.B. 128kbps verändert werden.
\begin{center}
\textbf{zeya --bitrate=128} 
\end{center}
Um den Streamingserver automatisch beim Hochfahren des Webservers zu starten, kann die in der Standardinstallation verwendete Datei \textit{zeya.conf} aus dem Ordner "'etc"' nach \textit{/etc/init/zeya.conf} kopiert werden. In \textit{zeya.conf} muss dann lediglich \textbf{exec python /usr/bin/zeya --path=/var/music --port=8080}  am Ende angehängt werden.




\begin{figure}
\dirtree{%
.1 \textbf{Zeya}/.
.2 backends.py.
.2 zeya.py (Main).
.2 common.py.
.2 decoders.py.
.2 directory.py.
.2 m3u.py.
.2 options.py.
.2 pls.py.
.2 rhythmbox.py.
.2 zeyaclient.py.
.2 \textbf{recources}/.
.3 clear\_search.png.
.3 favicon.png.
.3 next.png.
.3 pause.png.
.3 play.png.
.3 previous.png.
.3 repeat.png.
.3 search.png.
.3 shuffle.png.
.3 spinner.png.
.3 zeya.js.
.3 zeya.css.
.3 library.html.	
}
\caption{Ordnerstruktur und Inhalt}
\label{Ordnerstruk}
\end{figure}




\clearpage
\part{Anwendung}

\paragraph*{Zugriff auf Titel}
Unter \textbf{http://host:8080} findet man das Standardfrontend des Server. Sollen jedoch Links auf einzelne Musiktitel verwendet werden, so ist dies mittels dem Direktlink \textbf{host:8080/getcontent?key=1} möglich. Den jeweiligen Key kann man mittels \textbf{host:8080/getlibrary} abfragen.

\paragraph*{Loggen in Datenbank}
Die modifizierten Pythonskripte ermöglichen ein Loggen der Zugriffe in eine MySQL Datenbank. Dazu wurde das Pythonmodul "'MySQLdb"' verwendet, welches auf dem jeweiligen Server installiert sein muss. "'MySQLdb"' ist z.B. hier erhältlich:
\begin{center}
\url{http://sourceforge.net/projects/mysql-python/}
\end{center}
Das Pythonskript \textit{threading\_local} (siehe Abbildung \ref{logging}) erstellt dabei die Verbindung zur Datenbank und generiert für jeden Userzugriff einen eigenen Logthread um die Zugriffe getrennt voneinander aufzeichnen zu können. Dafür verwendet es das Pythonmodul 'threading'.\\
Im Pythonskript \textit{threading\_local} müssen dabei die richtigen Userdaten für die MySQL Datenbank geschrieben werden. 
\begin{figure}
\begin{lstlisting}
def write_to_log():
    
    if mydata.flag == 1:
      
        # Verbindung zur Datenbank aufbauen
        conn = MySQLdb.connect (user = "root",
                        host = "localhost",
                        passwd = "XXXX",
                        db = "kompassS")

        cursor = conn.cursor ()
\end{lstlisting}
\caption{Pythoncode für Verbindung zur Datenbank}
\label{logging}
\end{figure}

Eine richtige Zuweisung von Patienten und Serverzugriffen kann mittels zwei Methoden erreicht werden.
\begin{center}
\begin{itemize}
\item[1.] Abfragen der IP des Users
\item[2.] Versenden von Links mit integrierter User ID
\end{itemize}
\end{center}
Die Abfrage der IP kann mit dem Befehl "'BaseHTTPRequestHandler.address\_string(self)"' am Anfang des GetRequests (\textit{do\_Get}) in der "'ZeyaHandlerImpl"' Klasse erfolgen. Auf Grund der Tatsache, dass User in einem WLAN Netz hinter einem Router nach außen hin eine gleiche IP Adresse haben können, sollte die Verwendung der zweiten Methode bevorzugt werden. Dabei wird ein vom Server generierter Link an den User versandt, welcher am Ende des Links die Session ID an Zeya übergibt. Dann extrahiert Zeya die Session ID und verwendet lediglich den ersten Teil des Links um auf den jeweiligen Musiktitel zuzugreifen. 
\begin{center}
$\underbrace{\text{host:8080/getcontent?key=1}}_{\text{Link zu Musikstück}} \underbrace{\text{a}}_{\text{Trennzeichen}}\underbrace{\text{1234}}_{\text{Session ID}}$
\end{center}

Um einen Zugriff über einen versandten Link von einem Zugriff über das Frontend des Servers (erreichbar unter host:8080) unterscheiden zu können, wird bei Zugriffe auf das Frontend die ID 9999 in die Datenbank geloggt. Das Verhalten von Zeya auf die Länge des verwendeten Links kann in der Datei zeya.py verändert werden.




\paragraph*{Beenden des Streamingservers}
Um den Streamingserver zu beenden, werden zunächst im Terminal alle Prozessidentifikationsnummern (PID) mittels \textit{ps aux} angefordert. Nun können die zu Zeya gehördenden PIDs gefunden und danach die Prozesse mittels \textit{kill 'PID'} beendet werden.

\paragraph*{Neustart des Streamingservers}
Um den Streamingsever neuzustarten führt man lediglich den Befehl \textit{python zeya.py} in dem Ordner in dem sich das Skript \textit{zeya.py} befindet aus. Handelt es sich um eine entfernte Verbindung mittels SSH, muss das Skript im Hintergrund gestartet werden, um den Server nach Beenden der entfernten Verbidnung nicht ebenfalls zu terminieren. Dies erfolgt mittels folgender Eingabe.
\begin{center}
nohup python /var/www/html/music/zeya.py --path=/var/www/html/music/Music
\end{center}
Die Meldung \textit{nohup: ignoring input and appending output to `nohup.out'} kann dabei ignoriert werden, dies bedeutet lediglich, dass auch die Standardfehler im logfile \textit{nohup.out} abgelegt werden.





\clearpage
\part{Problemlösung}
Wurde der Server absichtlich über "'SIGQUIT"' (strg + C) oder unerwartet beendet, kann es beim Neustarten zu Fehlermeldung kommen. Unsachgemäßes Beenden führt dazu, dass die Serveradresse noch im Gebrauch ist.
\begin{center}
Fehler: \textbf{address in use, socket error}
\end{center}
Mit Hilfe des Werkzeugs "'list open files"' können durch Programme geöffnete Sockets angezeigt werden. Folgender Befehl liefert alle Prozesse oder Programme aus, welche den Port 8080 verwenden:
\begin{center}
\textbf{lsof -i :8080}
\end{center}
Danach können die noch laufenden PID zu den auf Port 8080 zugreifenden Prozesse beendet werden.
\begin{center}
\textbf{kill \textit{PID}}
\end{center}
Wichtig dabei ist natürlich, dass Zeya auf Port 8080 konfiguriert ist.





\end{document}
